home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / ms_dos / fplink / fplinki.c < prev    next >
Text File  |  1993-11-30  |  17KB  |  676 lines

  1. /*    PC98<->IBM<->FMR ファイル転送 for IBM Copyright (c) E.Suto    , 1992-1993 */
  2. /*    修正履歴  Ver  0.00     1992/06/22     試作品                                    */
  3. /*              Ver  0.10     1992/06/23     近所公開版                                */
  4. /*              Ver  0.20     1992/06/26     簡易サーバーモード追加,共用ドライブ対応*/
  5. /*              Ver  0.21     1992/06/28     リモートコマンド追加                    */
  6. /*              Ver  0.30     1992/06/30     TIMEOUT()改造,オプション統合,速度表示    */
  7. /*              Ver  0.31     1992/07/03     簡易サーバーを出来るだけ止めないよう    */
  8. /*              Ver  0.32     1992/07/03     速度表示の0割り算ガード(超手抜き)    */
  9. /*              Ver  0.33     1992/07/06     . の消し方変更                            */
  10. /*              Ver  0.34     1992/07/10     受信ファイルがルートに行ってしまうバグ修正    */
  11. /*              Ver  0.35     1992/11/17     RS232Cのバグ修正(98版のみ)    */
  12. /*              Ver  0.36     1992/11/17     ちょっと高速化(^^;                        */
  13. /*              Ver  0.37     1992/11/18     タイマ値最適化                            */
  14. /*              Ver  0.38     1992/11/18     送信ファイル名バグ修正                    */
  15. /*              Ver  0.39     1992/11/18     サーバーバグ修正                        */
  16. /*              Ver  0.41     1993/02/04     inpのwaitを#defineに                    */
  17. /*              Ver  0.42     1993/02/04     ソースをちょっと統合(^^;                */
  18. /*              Ver  1.00     1993/ 2/ 3     失敗時にタイムアウトしない                */
  19. /*              Ver  1.01     1993/ 2/ 4     コマンド受信処理でタイムアウトしない    */
  20. /*              Ver  3.00     1993/ 3/25     PC98/FMR版と統合                */
  21. /*              Ver  3.01     1993/ 4/ 1     低レベルI/Oテスト版                    */
  22. /*              Ver  3.02     1993/ 5/31     コマンド”判定バグ修正                    */
  23. /*              Ver  3.03     1993/ 6/29     接続失敗に対する修正                    */
  24. /*              Ver  3.03E 1993/ 6/30     英語のような物にメッセージ変更            */
  25. /*              Ver  3.04     1993/ 7/ 8     接続失敗に対するさらに修正                */
  26. /*              Ver  3.05     1993/ 7/15     正常終了時exit(0)に                    */
  27. /*              Ver  3.06     1993/ 8/ 2     サーバータイムアウト対策                */
  28. /*              Ver  3.07     1993/ 8/ 2     対98/TOWNSの受信高速化?        */
  29. /*              Ver  3.08     1993/ 8/ 2     対98/TOWNSの受信高速化-II        */
  30. /*              Ver  3.09     1993/ 8/15     IBMのタイムアウト時間短縮            */
  31.  
  32. #define _IBM
  33.  
  34. #include    "fplink.h"
  35.  
  36. static    unsigned char    send_mc        ; /* モデムコントロール値                */
  37. static    unsigned char    send_lc        ; /* ラインコントロール値                */
  38. static    unsigned int    rs_line_c    ; /* ラインコントロール                    */
  39. static    unsigned int    rs_line_s    ; /* ラインステータス                    */
  40. static    unsigned int    rs_int        ; /* 割り込みコントロール                */
  41. static    unsigned int    rs_in        ; /* モデムステータス                    */
  42. static    unsigned int    rs_out        ; /* モデムコントロール                    */
  43. static    unsigned char    rs_int_data ; /* 割り込みデータ                        */
  44.  
  45. static    unsigned char    data1_7[8]= {0x00,0x01,0x00,0x01,0x02,0x03,0x02,0x03} ;
  46. static    unsigned char    data2_7[8]= {0x00,0x00,0x40,0x40,0x00,0x00,0x40,0x40} ;
  47. static    unsigned char    stat_7[8] = {0x00,0x40,0x80,0xc0,0x10,0x50,0x90,0xd0} ;
  48. static    unsigned char    _7data[256] ;
  49.  
  50.  
  51. void main(int argc,char *argv[])
  52. {
  53.     int i , j , k , l , m ;
  54.     unsigned char *c ;
  55.  
  56.     debug      = 0 ;
  57.     mode      = -1 ;
  58.     rs_out      = 0x03fc ;
  59.     rs_line_c = 0x03fb ;
  60.     rs_line_s = 0x03fd ;
  61.     rs_in      = 0x03fe ;
  62.     rs_int      = 0x03f9 ;
  63.  
  64.     _7data[0x00]= 0 ;
  65.     _7data[0x40]= 1 ;
  66.     _7data[0x80]= 2 ;
  67.     _7data[0xc0]= 3 ;
  68.     _7data[0x10]= 4 ;
  69.     _7data[0x50]= 5 ;
  70.     _7data[0x90]= 6 ;
  71.     _7data[0xd0]= 7 ;
  72.  
  73.     strcpy( command , "" ) ;
  74.     strcpy( path , "" ) ;
  75.  
  76. /* コピーライト表示 */
  77.     copyright() ;
  78.  
  79. /* 割り込み処理定義 */
  80.     signal( SIGINT , sig_out ) ;
  81.  
  82. /* オプションチェック */
  83.     if( argc < 2 ) {
  84.         usage() ;
  85.         exit( 0 ) ;
  86.     }
  87.     else {
  88.         k = l = 0 ;
  89.         for( i=1 ; i<argc ; i++ ) {
  90.             c = argv[i] ;
  91.             if( *c == '-' || *c == '/' ) {
  92.                 switch( *++c ) {
  93.                 case '?' :
  94.                     usage();
  95.                     exit( 0 );
  96.                 case 'i' :
  97.                 case 'I' :
  98.                     debug = -1 ;
  99.                     break ;
  100.                 case 'R' :
  101.                 case 'r' :
  102.                     if( k ) mode = 4 ;
  103.                     else mode = 1 ;
  104.                     break ;
  105.                 case 'S' :
  106.                 case 's' :
  107.                     mode = 0 ;
  108.                     break ;
  109.                 case 'Z' :
  110.                 case 'z' :
  111.                     mode = 2 ;
  112.                     break ;
  113.                 case 'C' :
  114.                 case 'c' :
  115.                     mode = 5 ;
  116.                     c++ ;
  117.                     strcpy( command , c ) ;
  118.                     if( command[0] == '"' ) {
  119.                         for( ; i < argc ; ) {
  120.                             if( ( strlen( command ) > 1 )
  121.                             && ( command[strlen( command ) - 1 ] == '"' ) )
  122.                                 break ;
  123.                             i++ ;
  124.                             strcat( command , " " ) ;
  125.                             strcat( command , argv[i] ) ;
  126.                         }
  127.                     }
  128.                     break ;
  129.                 case 'X' :
  130.                 case 'x' :
  131.                     c++ ;
  132.                     l = -1 ;
  133.                     strcpy( path , c ) ;
  134.                     break ;
  135.                 case 'P' :
  136.                 case 'p' :
  137.                     c++ ;
  138.                     if( *c != ' ' ) {
  139.                         if( sscanf( c , "%d" , &j ) == EOF )
  140.                             goto perr ;
  141.                         if( j == 0 ) {
  142.                             rs_out      = 0x03fc ;
  143.                             rs_line_c = 0x03fb ;
  144.                             rs_line_s = 0x03fd ;
  145.                             rs_in      = 0x03fe ;
  146.                             rs_int      = 0x03f9 ;
  147.                         }
  148.                         else {
  149.                             if( j == 1 ) {
  150.                                 rs_out      = 0x02fc ;
  151.                                 rs_line_c = 0x02fb ;
  152.                                 rs_line_s = 0x02fd ;
  153.                                 rs_in      = 0x02fe ;
  154.                                 rs_int      = 0x02f9 ;
  155.                             }
  156.                             else goto perr ;
  157.                         }
  158.                     }
  159.                     else {
  160.                         rs_out      = 0x03fc ;
  161.                         rs_line_c = 0x03fb ;
  162.                         rs_line_s = 0x03fd ;
  163.                         rs_in      = 0x03fe ;
  164.                         rs_int      = 0x03f9 ;
  165.                     }
  166.                     break ;
  167.                 default :
  168. perr:                    printf( "A wrong parameter is specified. whether two file names or more are specified.(%s)\n" , argv[i] ) ;
  169.                     usage() ;
  170.                     exit( -1 ) ;
  171.                 }
  172.             }
  173.             else {
  174.                 if( mode == 5 ) {
  175.                     if( strlen( command ) > 0 ) goto perr ;
  176.                     strcpy( command , c ) ;
  177.                     if( command[0] == '"' ) {
  178.                         for( ; i < argc ; ) {
  179.                             if( ( strlen( command ) > 1 )
  180.                             && ( command[strlen( command ) - 1 ] == '"' ) )
  181.                                 break ;
  182.                             i++ ;
  183.                             strcat( command , " " ) ;
  184.                             strcat( command , argv[i] ) ;
  185.                         }
  186.                     }
  187.                     else {
  188.                         for( ; i < argc ; ) {
  189.                             i++ ;
  190.                             if( ( *(argv[i]) == '-' ) || ( *(argv[i]) == '/' ) )
  191.                                 break ;
  192.                             strcat( command , " " ) ;
  193.                             strcat( command , argv[i] ) ;
  194.                         }
  195.                     }
  196.                 }
  197.                 else {
  198.                     if( k ) goto perr ;
  199.                     strcpy( name , argv[i] ) ;
  200.                     k = -1 ;
  201.                     if( mode == 1 ) mode = 4 ;
  202.                 }
  203.             }
  204.         }
  205.     }
  206.  
  207. /* オプションの関連チェック */
  208.     if( mode == -1 ) {
  209.         printf( "Please specify -r, -s, -z or -c.\n" ) ;
  210.         usage() ;
  211.         exit( -1 ) ;
  212.     }
  213.     if( !( k ) && ( mode == 0 ) ) {
  214.         printf( "When -s is specified, the file name cannot be omitted.\n" ) ;
  215.         usage() ;
  216.         exit( -1 ) ;
  217.     }
  218.     if( l && ( mode != 0 ) ) {
  219.         printf( "-x cannot be specified besides -s is specified.\n" ) ;
  220.         usage() ;
  221.         exit( -1 ) ;
  222.     }
  223.     if( mode == 5 ) {
  224.         strcpy( buffer , command ) ;
  225.         if( buffer[0] == '"' ) {
  226.             m = strlen( buffer ) ;
  227.             if( buffer[m-1] != '"' ) {
  228.                 printf( "\" by which the end of the command is shown is insufficient.(%s)\n",buffer ) ;
  229.                 usage() ;
  230.                 exit( -1 ) ;
  231.             }
  232.             buffer[m-1] = 0x00 ;
  233.             strcpy( command , ( buffer + 1 ) ) ;
  234.         }
  235.         if( strlen( command ) == 0 ) {
  236.             printf( "Please specify a remote command following -c .\n" ) ;
  237.             usage() ;
  238.             exit( -1 ) ;
  239.         }
  240.         if( strlen( command ) > 114 ) {
  241.             printf( "The command is too long though it is not .\n" ) ;
  242.             printf( "Please make to 114 characters or less.\n" ) ;
  243.             usage() ;
  244.             exit( -1 ) ;
  245.         }
  246.     }
  247.  
  248. /* タイムアウト値設定 */
  249.     timeset() ;
  250.  
  251. /* 回線の初期化 */
  252.     rs_init = rs_set ;
  253.     rs_init() ;
  254.     rs_init = rs_reset ;
  255.  
  256. /* 送受信処理へ */
  257.     switch( mode ) {
  258.     case 0 :                /* 送信処理 */
  259.         connect_s() ;
  260.         fp_send() ;
  261.         break ;
  262.     case 1 :                /* 受信処理 */
  263.         connect_r() ;
  264.         fp_receive0() ;
  265.         fp_receive() ;
  266.         break ;
  267.     case 2 :                /* サーバー処理 */
  268.         fp_server() ;
  269.         break ;
  270.     case 4 :                /* サーバーからの受信処理 */
  271.         connect_s() ;
  272.         fp_file() ;
  273.         fp_receive0() ;
  274.         fp_receive() ;
  275.         break ;
  276.     case 5 :                /* リモートコマンド処理 */
  277.         connect_s() ;
  278.         fp_command() ;
  279.         break ;
  280.     }
  281.  
  282. /* 後始末 */
  283.     printf( "The telephotography processing was done.\n" ) ;
  284.     rs_init() ;
  285.     exit( 0 ) ;
  286.  
  287. }
  288.  
  289. /* 8250の初期化 */
  290. void rs_set()
  291. {
  292.  
  293. /* 割り込みの禁止 */
  294.     di() ;
  295.  
  296. /* ラインステータスレジスタ */
  297.     inp( rs_line_s ) ;
  298.  
  299. /* モデムコントロールレジスタ */
  300.     send_mc = ( inp( rs_out ) & 0x1c ) ;
  301.     outp( rs_out , send_mc ) ;
  302.  
  303. /* ラインコントロールレジスタ */
  304.     send_lc = ( inp( rs_line_c ) & 0xbf ) ;
  305.     outp( rs_line_c , ( send_lc & 0x7f ) ) ;
  306.  
  307. /* 割り込みの禁止 */
  308.     rs_int_data = inp( rs_int ) & 0x0f ;
  309.     outp( rs_int , 0x00 ) ;
  310.  
  311. /* 割り込み許可 */
  312.     ei() ;
  313.  
  314. }
  315.  
  316. /* 8250の初期化 */
  317. void rs_reset()
  318. {
  319.  
  320. /* 割り込みの禁止 */
  321.     di() ;
  322.  
  323. /* ラインステータスレジスタ */
  324.     inp( rs_line_s ) ;
  325.  
  326. /* モデムコントロールレジスタ */
  327.     outp( rs_out , send_mc ) ;
  328.  
  329. /* ラインコントロールレジスタ */
  330.     outp( rs_line_c , ( send_lc & 0x7f ) ) ;
  331.  
  332. /* 割り込みの許可 */
  333.     outp( rs_int , rs_int_data ) ;
  334.  
  335. /* ラインコントロールレジスタ */
  336.     outp( rs_line_c , send_lc ) ;
  337.  
  338. /* 割り込み許可 */
  339.     ei() ;
  340.  
  341. }
  342.  
  343. /* 接続確認待ち(送信型)*/
  344. int connect_s()
  345. {
  346.     unsigned char stat1,stat2,stat0 ;
  347.     long j ;
  348.  
  349. /* 接続確認 */
  350.     palawait = PALAWAIT_I ;
  351.     if( mode != 2 ) printf( "It is connected waiting.\n" ) ;
  352.     outp( rs_line_c , send_lc ) ;
  353.     outp( rs_out , send_mc | 0x01 ) ;    /* ずーと待つからsendは使わない        */
  354.     stat0 = 0x00 ;
  355.     stat1 = 0x40 ;
  356.     stat2 = 0xd0 ;
  357.     for( j = 0 ; j < palawait*20 ; j++ ) ;
  358.  
  359. con_init1:
  360.     while( ( inp( rs_in     ) & 0xd0 ) != stat1 ) {
  361.         printf( "*\r" ) ;
  362.         if( kbhit() ) {
  363.             if( getch() == 0x1b ) sig_out() ;
  364.         }
  365.     }
  366.     for( j = 0 ; j < palawait*30 ; j++ ) ;
  367.     if( ( inp( rs_in ) & 0xd0 ) != stat1 ) goto con_init1 ;
  368.  
  369.     outp( rs_line_c , send_lc | 0x40 ) ;
  370.     outp( rs_out , send_mc | 0x03 ) ;    /* ずーと待つからsendは使わない        */
  371. con_init2:
  372.     for( j = 0 ; j < palawait*30 ; j++ ) ;
  373.     while( ( inp( rs_in ) & 0xd0 ) != stat2 ) {
  374.         printf( "*\r" ) ;
  375.         if( kbhit() ) {
  376.             if( getch() == 0x1b ) sig_out() ;
  377.         }
  378.         if( ( inp( rs_in ) & 0xd0 ) == stat0 ) goto con_init1 ;
  379.     }
  380.     if( ( inp( rs_in ) & 0xd0 ) == stat0 ) goto con_init1 ;
  381.     if( ( inp( rs_in ) & 0xd0 ) == stat1 ) goto con_init1 ;
  382.     for( j = 0 ; j < palawait*30 ; j++ ) ;
  383.     if( ( inp( rs_in ) & 0xd0 ) != stat2 ) goto con_init2 ;
  384.  
  385.     old_send = old_receive = 7 ;
  386.  
  387.     buffer[0] = 0xe4 ;            /* このへんの文字は何でも良い(^^;    */
  388.     if( send_( 1 , buffer ) ) {
  389.         if( mode == 2 ) return( -1 ) ;
  390.         else timeout() ;
  391.     }
  392.     if( debug ) printf( "Type connection transmission OK.\n" ) ;
  393.  
  394. /* 機種情報交換 */
  395.     buffer[0] = 'I' ;            /* 私はIBMどす(^^;    */
  396.     if( send_( 1 , buffer ) ) {
  397.         if( mode == 2 ) return( -1 ) ;
  398.         else timeout() ;
  399.     }
  400.  
  401.     if( receive_( 1 , buffer ) ) {
  402.         if( mode == 2 ) return( -1 ) ;
  403.         timeout() ;
  404.     }
  405.  
  406.     switch( buffer[0] ) {
  407.         case 'I' :
  408.             palawait = PALAWAIT_I ;
  409.             if( debug ) printf( "The opponent is IBM.\n" ) ;
  410.             break ;
  411.         case 'P' :
  412.             palawait = PALAWAIT_P + 1 ;
  413.             if( debug ) printf( "The opponent is PC98 or FMR.\n" ) ;
  414.             break ;
  415.         default :
  416.             printf( "The error occurred by the opponent confirmation processing.\n" ) ;
  417.             if( mode == 2 ) return( -1 ) ;
  418.             rs_init() ;
  419.             exit( -1 ) ;
  420.     }
  421.  
  422.     return( 0 ) ;
  423.  
  424. }
  425.  
  426. /* 接続確認待ち(受信型)*/
  427. int connect_r()
  428. {
  429.     unsigned char stat1,stat2 ;
  430.     long j ;
  431.  
  432. /* 接続確認 */
  433.     palawait = PALAWAIT_I ;
  434.     if( mode != 2 ) printf( "It is connected waiting.\n" ) ;
  435.     outp( rs_line_c , send_lc ) ;
  436.     outp( rs_out , send_mc ) ;    /* 状態戻し    */
  437.     stat1 = 0x40 ;
  438.     stat2 = 0xd0 ;
  439.     for( j = 0 ; j < palawait*30 ; j++ ) ;
  440. con_init3:
  441.     while( ( inp( rs_in     ) & 0xd0 ) != stat1 ) {
  442.         printf( "*\r" ) ;
  443.         if( kbhit() ) {
  444.             if( getch() == 0x1b ) sig_out() ;
  445.         }
  446.         if( ( inp( rs_in ) & 0xd0 ) == stat2 ) break ;
  447.     }
  448.     for( j = 0 ; j < palawait*10 ; j++ ) ;
  449.     if( ( inp( rs_in ) & 0xd0 ) != stat1 ) goto con_init3 ;
  450.     outp( rs_line_c , send_lc ) ;
  451.     outp( rs_out , send_mc | 0x01 ) ;    /* ずーと待つからsendは使わない        */
  452.     for( j = 0 ; j < palawait*30 ; j++ ) ;
  453.  
  454. con_init4:
  455.     while( ( inp( rs_in     ) & 0xd0 ) != stat2 ) {
  456.         printf( "*\r" ) ;
  457.         if( kbhit() ) {
  458.             if( getch() == 0x1b ) sig_out() ;
  459.         }
  460.     }
  461.     for( j = 0 ; j < palawait*10 ; j++ ) ;
  462.     if( ( inp( rs_in ) & 0xd0 ) != stat2 ) goto con_init4 ;
  463.     outp( rs_line_c , send_lc | 0x40 ) ;
  464.     outp( rs_out , send_mc | 0x03 ) ;    /* ずーと待つからsendは使わない        */
  465.  
  466.     for( j = 0 ; j < palawait*30 ; j++ ) ;
  467.     old_send = old_receive = 7 ;
  468.  
  469.     if( receive_( 1 , buffer ) ) {
  470.         if( mode == 2 ) return( -1 ) ;
  471.         timeout() ;
  472.     }
  473.  
  474.     if( buffer[0] != 0xe4 ) {    /* このへんの文字は送信側に合わせる        */
  475.         printf( "The error occurred by connected confirmation processing.\n" ) ;
  476.         if( mode == 2 ) return( -1 ) ;
  477.         rs_init() ;
  478.         exit( -1 ) ;
  479.     }
  480.     if( debug ) printf( "Reception type connection OK.\n" ) ;
  481.  
  482. /* 機種情報交換 */
  483.     if( receive_( 1 , buffer ) ) {
  484.         if( mode == 2 ) return( -1 ) ;
  485.         timeout() ;
  486.     }
  487.  
  488.     switch( buffer[0] ) {
  489.         case 'I' :
  490.             palawait = PALAWAIT_I ;
  491.             if( debug ) printf( "The opponent is IBM.\n" ) ;
  492.             break ;
  493.         case 'P' :
  494.             palawait = PALAWAIT_P + 1 ;
  495.             if( debug ) printf( "The opponent is PC98 or FMR.\n" ) ;
  496.             break ;
  497.         default :
  498.             printf( "The error occurred by the opponent confirmation processing.\n" ) ;
  499.             if( mode == 2 ) return( -1 ) ;
  500.             rs_init() ;
  501.             exit( -1 ) ;
  502.     }
  503.  
  504.     buffer[0] = 'I' ;            /* 私はIBMどす(^^;    */
  505.     if( send_( 1 , buffer ) ) {
  506.         if( mode == 2 ) return( -1 ) ;
  507.         else timeout() ;
  508.     }
  509.     if( debug ) printf( "Model information transmission OK.\n" ) ;
  510.  
  511.     return( 0 ) ;
  512.  
  513. }
  514.  
  515. /* 回線送信処理 IBM */
  516. int send_( int l , unsigned char *b )
  517. {
  518.     int i ;
  519.     long k,j ;
  520.     unsigned char stat0,stat1,n,data1,data2 ;
  521.  
  522. /* 受信>送信保証 */
  523.     for( j = 0 ; j < palawait ; j++ ) ;
  524. /* 1バイトを3つに区切って3ビット毎に送信 */
  525.     for( i = 0 ; i < l ; i++ ) {
  526. /* 割り込み禁止 */
  527.         di() ;
  528. /* 一個目(^^; */
  529.         old_send = n = ( old_send + rem_7[*b] + 1u ) % 8u ;
  530.         stat0 = stat_7[n] ;
  531.         data1 = send_mc | data1_7[n] ;
  532.         data2 = send_lc | data2_7[n] ;
  533.         outp( rs_out    , data1 ) ;
  534.         outp( rs_line_c , data2 ) ;
  535. /* 二個目(^^; */
  536.         old_send = n = ( old_send + rem_7[div_7[*b]] + 1u ) % 8u ;
  537.         stat1 = stat_7[n] ;
  538.         for( k = timeout1 ; ( ( inp( rs_in )  ) & 0xd0 ) != stat0
  539.                 ; k-- ) {
  540.             if( !( k ) ) {
  541.                 ei() ;
  542.                 return( -1 ) ;
  543.             }
  544.         }
  545.         data1 = send_mc | data1_7[n] ;
  546.         data2 = send_lc | data2_7[n] ;
  547.         outp( rs_out    , data1 ) ;
  548.         outp( rs_line_c , data2 ) ;
  549. /* 三個目(^^; */
  550.         old_send = n = ( old_send + div_49[*b] + 1u ) % 8u ;
  551.         stat0 = stat_7[n] ;
  552.         for( k = timeout1 ; ( ( inp( rs_in )  ) & 0xd0 ) != stat1
  553.                 ; k-- ) {
  554.             if( !( k ) ) {
  555.                 ei() ;
  556.                 return( -1 ) ;
  557.             }
  558.         }
  559.         data1 = send_mc | data1_7[n] ;
  560.         data2 = send_lc | data2_7[n] ;
  561.         outp( rs_out    , data1 ) ;
  562.         outp( rs_line_c , data2 ) ;
  563.         for( k = timeout1 ; ( ( inp( rs_in )  ) & 0xd0 ) != stat0
  564.                 ; k-- ) {
  565.             if( !( k ) ) {
  566.                 ei() ;
  567.                 return( -1 ) ;
  568.             }
  569.         }
  570. /* 次のバイト処理へ */
  571.         b++ ;
  572. /* 割り込み許可 */
  573.         ei() ;
  574.     }
  575.     old_receive = old_send ;
  576.     return( 0 ) ;
  577.  
  578. }
  579.  
  580. /* 回線受信処理 IBM */
  581. int receive_( int l , unsigned char *b )
  582. {
  583.     int i , j ;
  584.     long k ;
  585.     unsigned char stat,data,data1,data2,stat0 ;
  586.  
  587. /* 3ビットを3つ受信で1バイト */
  588.     for( i = 0 ; i < l ; i++ ) {
  589. /* 割り込み禁止 */
  590.         di() ;
  591. /* 一個目受信(^^; */
  592.         stat0 = stat_7[old_receive] ;
  593.         for( k = timeout1 ; ( inp( rs_in ) & 0xd0 ) == stat0 ; k-- ) {
  594.             if( !( k ) ) {
  595.                 ei() ;
  596.                 return( -1 ) ;
  597.             }
  598.         }
  599.         for( j = 0 ; j < palawait ; j++ ) ;
  600.         stat = inp( rs_in ) & 0xd0 ;
  601.         data = _7data[stat] ;
  602.         if( data < old_receive ) data += 8u ;
  603.         *b = data - old_receive - 1u ;
  604.         old_receive = _7data[stat] ;
  605.         data1 = send_mc | data1_7[old_receive] ;
  606.         data2 = send_lc | data2_7[old_receive] ;
  607.         outp( rs_out    , data1 ) ;
  608.         outp( rs_line_c , data2 ) ;
  609. /* 二個目受信(^^; */
  610.         stat0 = stat_7[old_receive] ;
  611.         for( k = timeout1 ; ( inp( rs_in ) & 0xd0 ) == stat0 ; k-- ) {
  612.             if( !( k ) ) {
  613.                 ei() ;
  614.                 return( -1 ) ;
  615.             }
  616.         }
  617.         for( j = 0 ; j < palawait ; j++ ) ;
  618.         stat = inp( rs_in ) & 0xd0 ;
  619.         data = _7data[stat] ;
  620.         if( data < old_receive ) data += 8u ;
  621.         *b += mul_7[data - old_receive - 1u] ;
  622.         old_receive = _7data[stat] ;
  623.         data1 = send_mc | data1_7[old_receive] ;
  624.         data2 = send_lc | data2_7[old_receive] ;
  625.         outp( rs_out    , data1 ) ;
  626.         outp( rs_line_c , data2 ) ;
  627. /* 三個目受信(^^; */
  628.         stat0 = stat_7[old_receive] ;
  629.         for( k = timeout1 ; ( inp( rs_in ) & 0xd0 ) == stat0 ; k-- ) {
  630.             if( !( k ) ) {
  631.                 ei() ;
  632.                 return( -1 ) ;
  633.             }
  634.         }
  635.         for( j = 0 ; j < palawait ; j++ ) ;
  636.         stat = inp( rs_in ) & 0xd0 ;
  637.         data = _7data[stat] ;
  638.         if( data < old_receive ) data += 8u ;
  639.         *b += mul_49[data - old_receive - 1u] ;
  640.         old_receive = _7data[stat] ;
  641.         data1 = send_mc | data1_7[old_receive] ;
  642.         data2 = send_lc | data2_7[old_receive] ;
  643.         outp( rs_out    , data1 ) ;
  644.         outp( rs_line_c , data2 ) ;
  645. /* 次のバイト処理へ */
  646.         b++ ;
  647. /* 割り込み許可 */
  648.         ei() ;
  649.     }
  650.     old_send = old_receive ;
  651.     return( 0 ) ;
  652.  
  653. }
  654.  
  655. /* コピーライト表示 */
  656. void copyright()
  657. {
  658.     printf(
  659.         "IBM=98=FMR File transmitter for IBM Ver 3.09, Copyright (C) E.Suto , 1992-1993\n"
  660.         ) ;
  661. }
  662.  
  663. /* 使い方表示 */
  664. void usage()
  665. {
  666.     printf( "Direction                : FPLINKI [options] [file-name]\n" ) ;
  667.     printf( "Options    -s            : File transmission(file-name)\n" ) ;
  668.     printf( "      -r            : File reception\n" ) ;
  669.     printf( "      -z            : Server mode\n" ) ;
  670.     printf( "      -c command   : A remote command is transmitted to the server.\n" ) ;
  671.     printf( "      -x[path_name] : Storage path name in -s\n" ) ;
  672.     printf( "      -p            : Port number[0/1] default:0\n" ) ;
  673.     printf( "          -i            : Detailed information display\n" ) ;
  674. }
  675.  
  676.